package cn.bugstack.domain.activity.model.valobj;

import cn.bugstack.types.common.Constants;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;
import java.util.Objects;

/**
 * @description 拼团活动营销配置值对象
 */
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GroupBuyActivityDiscountVO {

    /** 活动ID */
    private Long activityId;
    /** 活动名称 */
    private String activityName;
    /** 折扣配置 */
    private GroupBuyDiscount groupBuyDiscount;
    /** 拼团方式（0自动成团、1达成目标拼团） */
    private Integer groupType;
    /** 拼团次数限制 */
    private Integer takeLimitCount;
    /** 拼团目标 */
    private Integer target;
    /** 拼团时长（分钟） */
    private Integer validTime;
    /** 活动状态（0创建、1生效、2过期、3废弃） */
    private Integer status;
    /** 活动开始时间 */
    private Date startTime;
    /** 活动结束时间 */
    private Date endTime;
    /** 人群标签规则标识 */
    private String tagId;
    /** 人群标签规则范围 */
    private String tagScope;

    /**
     * 可见限制，直接将这段逻辑写在 VO对象中，以活动为单位，判断 该活动是否有人群标签这种限制。
     * true 代表没有人群标签。 false 代表存在 可见性人群标签    并不代表对单个用户的可见性
     * 只要存在这样一个值，那么首次获得的默认值就是 false
     */
    public boolean isVisible() {
        // 活动的限定标签为空时，即不限定人群，所以直接返回true，对所有人可见
        if (StringUtils.isBlank(this.tagScope)) return TagScopeEnumVO.VISIBLE.getAllow();
        String[] split = this.tagScope.split(Constants.SPLIT);
        // 只要有人群标签，默认设置成 false，后续再针对单个用户进行判断
        if (split.length > 0 && Objects.equals(split[0], "1") && StringUtils.isNotBlank(split[0])) {
            return TagScopeEnumVO.VISIBLE.getRefuse();
        }
        // 活动存在人群标签，但不是可见性人群标签，所以也为 true
        return TagScopeEnumVO.VISIBLE.getAllow();
    }

    /**
     * 参与限制
     * true 代表没有人群标签。 false 代表存在人群标签
     * 只要存在这样一个值，那么首次获得的默认值就是 false
     */
    public boolean isEnable() {
        if (StringUtils.isBlank(this.tagScope)) return TagScopeEnumVO.VISIBLE.getAllow();
        String[] split = this.tagScope.split(Constants.SPLIT);
        if (split.length == 2 && Objects.equals(split[1], "2") && StringUtils.isNotBlank(split[1])) {
            return TagScopeEnumVO.ENABLE.getRefuse();
        }
        if (split.length == 1 && Objects.equals(split[0], "2")) {
            return TagScopeEnumVO.ENABLE.getRefuse();
        }
        // 活动存在人群标签，但是和此处函数判断的标签不匹配，所以直接放行
        return TagScopeEnumVO.ENABLE.getAllow();
    }

    @Getter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class GroupBuyDiscount {
        /** 折扣标题 */
        private String discountName;

        /** 折扣描述 */
        private String discountDesc;

        /** 折扣类型（0:base、1:tag） */
        private DiscountTypeEnum discountType;

        /** 营销优惠计划（ZJ:直减、MJ:满减、N元购） */
        private String marketPlan;

        /** 营销优惠表达式 */
        private String marketExpr;

        /** 人群标签，特定优惠限定 */
        private String tagId;
    }

}
